from django import http
from django.shortcuts import render

# Create your views here.
from django.views import View
from django_redis import get_redis_connection

from libs.captcha.captcha import captcha
from libs.yuntongxun.sms import CCP


class ImageCodeView(View):
    def get(self,request, uuid):
    # 获取图片和图片验证码的内容
        text,image = captcha.generate_captcha()
        # 将图片验证吗的内容保存在redis中。
        redis_conn = get_redis_connection('code')
        redis_conn.setex('img_%s' % uuid, 120, text)
        # code的setting，session复制一份
        # 返回图片。
        return http.HttpResponse(image, content_type='image/jpeg')

from utils.response_code import RETCODE

# 发送短信
class SmsCodeView(View):
    def get(self,request,mobile):
        # 接受数据
        image_text = request.GET.get('image_code')   # 验证码
        uuid = request.GET.get('image_code_id')   # uuid

        # 验证数据
        if not(image_text,uuid):
            return http.JsonResponse({'code': RETCODE.NECESSARYPARAMERR, 'errmsg': '缺少必传参数'})

        # 提取redis种的验证码
        redis_conn = get_redis_connection('code')
        text_redis = redis_conn.get("img_%s"%uuid)

        # 验证码可能过期了
        if text_redis is None:
            return http.JsonResponse({'code': RETCODE.IMAGECODEERR, 'errmsg': '图形验证码失效了'})

        # 删除redis种的验证码               ---------------------------------->   为什么
        redis_conn.delete("img_%s"%uuid)

        # 比对用户输入的和redis是否一致
        if text_redis.decode().lower() != image_text.lower():
            return http.JsonResponse({'code': RETCODE.IMAGECODEERR, 'errmsg': '图形验证码有误'})

        # 生成随机吗
        from random import randint

        # 生成send_flag,为了不让用户重复发送验证码
        send_flag = redis_conn.get('send_flag_%s' % mobile)
        # 设置一个send_flag，如果发送过就为1，设置时间为60秒，如果没发过就为0.
        # 判断是否重复发送短信验证码
        if send_flag:
            return http.JsonResponse({'code': RETCODE.THROTTLINGERR, 'errmsg': '操作太频繁了'})
        # 生成随机验证码
        sms_code ='%06d'% randint(0,999999)

        # 创建管道
        pipe = redis_conn.pipeline()

        # 保存验证码
        # redis_conn.setex('sms_%s' % mobile, 300, sms_code)
        # 保存send_flag
        # redis_conn.setex('send_flag_%s' % mobile, 60 , 1)

        # 将redis请求加入到队列里
        pipe.setex('sms_%s' % mobile, 300, sms_code)
        pipe.setex('send_flag_%s' % mobile, 60 , 1)

        # 执行请求
        pipe.execute()

        # 发送验证码
        # CCP().send_template_sms(mobile,[sms_code, 5],1)
        from celery_tasks.sms.tasks import send_sms_code
        send_sms_code.delay(mobile,sms_code)

        return http.JsonResponse({'code': RETCODE.OK, 'errmsg': '发送短信成功'})





